package com.csl.jsonpreference.configdes

import android.text.TextUtils
import com.csl.jsonpreference.bean.ConfigTYPE
import org.json.JSONObject
import java.lang.Exception

/**
 * json 基本类型
 */
open class JsonBasePreference : JsonConfigIns {


//    init(config: JsonConfig) {
//        if(config.type == ConfigTYPE.AUTO) {
//
//        }
//    }

    var jsonData: JSONObject? = null
    var classType: Class<*>? = null


    constructor(
        jsonData: JSONObject? = null,
        classType: Class<*>? = null,
        jsonConfig: JsonConfigIns? = null
    ) : super(jsonConfig?:JsonConfigIns("","", "", ConfigTYPE.AUTO)) {
        this.jsonData = jsonData
        this.classType = classType
        if (configType == ConfigTYPE.AUTO) {
            autoSetType(jsonData, classType, jsonConfig)
        }
        //根据类型配置
        when (configType) {
            ConfigTYPE.ENUM -> {
            }

            ConfigTYPE.COLOR -> {
            }

            ConfigTYPE.NUMBER -> {
            }

            ConfigTYPE.FLOAT -> {
            }

            ConfigTYPE.BOOLEAN -> {
            }
            else -> {
//                this.setConfigType(ConfigTYPE.TXT)
            }
        }
    }

    /**
     * 自动判断类型
     *
     */
    fun autoSetType(
        jsonData: JSONObject? = null,
        classType: Class<*>? = null,
        jsonConfig: JsonConfigIns?,
    ) {
        if (classType == null) {
            //无类型, 无法解析. 作为string
            this.setType(ConfigTYPE.TXT)
            return
        }
        when {
            classType.isEnum -> {
                this.setType(ConfigTYPE.ENUM)
            }

            classType.isPrimitive -> {
                //基本类型
                when (classType.name) {
                    "byte", "short","int","long" -> {
                        //数值类型
                        this.setType(ConfigTYPE.NUMBER)
                    }
                    "float","double" -> {
                        //浮点
                        this.setType(ConfigTYPE.FLOAT)
                    }
                    "boolean" -> {
                        this.setType(ConfigTYPE.BOOLEAN)
                    }
                    else -> {
                        this.setType(ConfigTYPE.TXT)
                    }
                }
            }
            else -> {
                when (classType) {
                    Int::class.java,Byte::class.java, Short::class.java, Long::class.java -> {
                        //数值类型
                        this.setType(ConfigTYPE.NUMBER)
                    }
                    Float::class.java, Double::class.java -> {
                        //浮点
                        this.setType(ConfigTYPE.FLOAT)
                    }
                    Boolean::class.java -> {
                        this.setType(ConfigTYPE.BOOLEAN)
                    }
                    else -> {
                        this.setType(ConfigTYPE.TXT)
                    }
                }
            }
        }
    }


    fun getAllEnum(): Array<Enum<*>>? {
        if (classType == null) {
            return null
        } else {
            return classType!!.getMethod("values").invoke(null) as Array<Enum<*>>
        }
    }


    /**
     * 获取枚举类型对应列表(需枚举类型)
     *
     * @return
     */
    fun getEnumType(): Array<Enum<*>>? {
        try {
            var method = classType?.getMethod("values")
            var alltype: Array<Enum<*>> = method?.invoke(null) as Array<Enum<*>>
            return alltype
        } catch (e: Exception) {
            return null
        }
    }

}